PostgreSQL pg_bulkload 限制场景
1 背景知识
本文介绍使用 pg_bulkload 一些限制场景。
2 DIRECT
导入表方法
pg_bulkload 目前支持将数据加载至 heap
访问方法的表中。在 PostgreSQL 12
中进行了修订,现在可以通过可插拔API 对表进行访问。
3 错误编码 pg_bulkload
以下显示了 pg_bulkload 可能返回的代码。用于 PostgreSQL pg_bulkload 错误诊断。
Return code | Description |
---|---|
0 | Success |
1 | Error occurred during running SQL in PostgreSQL |
2 | Failed to connect to PostgreSQL |
3 | Success, but some data could not be loaded |
4 DIRECT
模式
如果使用 DIRECT
或者 PARALLEL
模式,你需要考虑以下问题:
4.1 PostgreSQL 启动时的数据库恢复
当 pg_bulkload 遇到数据库崩溃时,此时 $PGDATA/pg_bulkload/.loadstatus
文件依旧存在,可以使用 postgresql 脚本调用 pg_bulkload -r
命令恢复数据库。
postgresql 脚本会正确的启动或者停止数据库。我们不建议直接使用 pg_ctl 。
由于windows 操作系统中不包括 postgresql 脚本。所以您必须手动调用 pg_bulkload -r 命令,以用于恢复数据库。
4.2 PITR/Replication
由于绕过了 WAL 日志,所以无法使用归档进行 PITR 恢复。如果想要使用 PITR 请在 pg_bulkload 导入数据之后,对数据库进行完成备份。
如果搭建了流复制的话,则需要重新创建备节点。以保证数据正常同步。
4.3 loadstatus文件
此文件存在于 $PGDATA/pg_bulkload
目录。pg_bulkload 崩溃之后需要使用此文件恢复数据库。
5 禁用 kill -9
命令
尽量不要使用 kill -9
终止 pg_bulkload 命令。如果使用了 kill -9
,如果想要数据得到保证,则必须调用 postgresql 脚本来执行恢复并重启数据库。
6 多进程并发导入时,身份验证失败
当设置 MUTI_PROCESS=YES
时,是需要密码才能通过 localhost
连接到导入的数据库时,即使输入正确密码,也会验证失败。为了避免下面的情况,请配置以下任何一种方法。
6.1 使用 trust
方法验证来自 localhost
的连接
UNIX
或LINUX
# TYPE DATABASE USER CIDR-ADDRESS METHOD [for UNIX]
local all foo trust
6.2 设置 .pgpass
文件
localhost:5432:*:foo:foopass
7 数据库约束
默认情况下,数据导入只会执行唯一约束和非空约束。可以设置 CHECK_CONSTRAINTS=YES
参数去检查检查约束。现目前无法检查外检约束。外键数据的合法性需要用户自己保证。